#include "encoder.h"
#include <iostream>
using namespace std;
extern "C"
{
#include <libavcodec/avcodec.h>
#include <libavutil/opt.h>
}

namespace lcf
{
    /// 编码数据 线程安全 每次新创建AVPacket
    /// @para frame 空间由用户维护
    /// @return 失败范围nullptr 返回的AVPacket用户需要通过av_packet_free 清理
    AVPacket *Encoder::Encode(const AVFrame *frame)
    {
        if (!frame)
            return nullptr;
        unique_lock<mutex> lock(mtx_);
        if (!context_)
            return nullptr;
        av_frame_make_writable((AVFrame *)frame);
        // 发送到编码线程
        auto re = avcodec_send_frame(context_, frame);
        if (re != 0)
            return nullptr;
        auto pkt = av_packet_alloc();
        // 接收编码线程数据
        re = avcodec_receive_packet(context_, pkt);
        if (re != 0)
        {
            PrintErr(re);
            av_packet_free(&pkt);
            return nullptr;
        }
        return pkt;
    }

}
